<?php
/**
 * MVM_MALL 网上商店系统
 * ============================================================================
 * 版权所有 (C) 2007-2010 www.mvmmall.com，并保留所有权利。
 * 网站地址: http://www.mvmmall.com
 * ----------------------------------------------------------------------------
 * 这是一个免费开源的软件；这意味着您可以在不用于商业目的的前提下对程序代码
 * 进行修改、使用和再发布。
 * ============================================================================
 * 
 * @author :     www.mvmmall.com <admin@mvmmall.com> 
 * @version :    v4.X
---------------------------------------------
 */
if(!defined('MVMMALL')){
    exit('Access Denied');
}
//插件的代码必须和文件名保持一致
$payment['tenpay']['name']    = '财付通';

//描述
$payment['tenpay']['desc']    = '财付通';

//支付费用
$payment['tenpay']['pay_fee'] = '0%';

// 是否支持在线支付
$spayment['tenpay']['online']  = 1;

//否支持货到付款
$payment['tenpay']['cod']     = 0;

//申请地址
$payment['tenpay']['reg']     = 'http://union.tenpay.com/mch/mch_register.shtml?posid=123&actid=84&opid=50&whoid=31&sp_suggestuser=1202036501';

//版权信息
$payment['tenpay']['license']  = '版权所有www.mvmmall.com';

//接口需要的参数
$payment['tenpay']['cfg'] =array(
        array('name' => 'v_mid', 'value' => '','label'=>'财付通账号'),
        array('name' => 'v_key', 'value' => '','label'=>'财付通密钥'),
    );
    
class tenpay
{
    var $cfg;
    
    function tenpay($cfg = array())
    {
        foreach ($cfg AS $key=>$val)
        {
            $this->cfg[$val['name']] = $val['value'];
        }
    }
    /*提交支付请求*/
function pay_send($sn,$amount)	
	{
	   /*这里替换为您的实际商户号*/
	    $strSpid    = $this->cfg[v_mid];
	    /*strSpkey是32位商户密钥, 请替换为您的实际密钥*/
	    $strSpkey   = $this->cfg[v_key];
	    /*财付通支付为"1" (当前只支持 cmdno=1)*/
	    $strCmdNo   = "1";
	    /*交易日期 (yyyymmdd)*/
	    $strBillDate= date('Ymd');
	    /*银行类型:
	    0		  财付通
	    1001	招商银行
	    1002	中国工商银行
	    1003	中国建设银行
	    1004	上海浦东发展银行
	    1005	中国农业银行
	    1006	中国民生银行
	    1008	深圳发展银行
	    1009	兴业银行   */
	    $strBankType= "0";
	    /*商品名称 用定单好代替*/
	    $strDesc    = $sn;
	    /*用户QQ号码, 现在置为空串*/
	    $strBuyerId = "";
	    /*商户号*/
	    $strSaler   = $strSpid;
	    /*商户生成的订单号*/
	    $strSpBillNo= substr($sn,4);
	    /*重要: 交易单号
	    交易单号(28位): 商户号(10位) + 日期(8位) + 流水号(10位), 必须按此格式生成, 且不能重复
	    如果sp_billno超过10位, 则截取其中的流水号部分加到transaction_id后部(不足10位左补0)
	    如果sp_billno不足10位, 则左补0, 加到transaction_id后部*/
	    $strTransactionId = $strSpid . $strBillDate . $strSpBillNo;
	    /*总金额, 分为单位*/
	    $strTotalFee = floatval($amount)*100;
	    /*货币类型: 1 – RMB(人民币) 2 - USD(美元) 3 - HKD(港币)*/
	    $strFeeType  = "1";
	    /*财付通回调页面地址, 推荐使用ip地址的方式(最长255个字符)*/
	    $strRetUrl  = MVMMALL_DIR."/respond.php?code=".basename(__FILE__, '.class.php');
	    /*商户私有数据, 请求回调页面时原样返回 把定单号存入商家原样数据*/
	    $strAttach  = "$sn";
	    /*生成MD5签名*/
	    $strSignText = "cmdno=" . $strCmdNo . "&date=" . $strBillDate . "&bargainor_id=" . $strSaler.
          "&transaction_id=" . $strTransactionId . "&sp_billno=" . $strSpBillNo .
          "&total_fee=" . $strTotalFee  . "&fee_type=" . $strFeeType . "&return_url=" . $strRetUrl .
          "&attach=" . $strAttach . "&key=" . $strSpkey;
	    $strSign = strtoupper(md5($strSignText));
		$result="
			<form action=\"https://www.tenpay.com/cgi-bin/v1.0/pay_gate.cgi\" target=_blank>
            <input type=hidden name=\"cmdno\"	value=$strCmdNo>
            <input type=hidden name=\"date\"	value=$strBillDate>
            <input type=hidden name=\"bank_type\"	value=$strBankType>
            <input type=hidden name=\"desc\"	value=$strDesc>
            <input type=hidden name=\"purchaser_id\"	value=$strBuyerId>
            <input type=hidden name=\"bargainor_id\" value=$strSaler>
            <input type=hidden name=\"transaction_id\"	value=$strTransactionId>
            <input type=hidden name=\"sp_billno\"	value=$strSpBillNo>
            <input type=hidden name=\"total_fee\"	value=$strTotalFee>
            <input type=hidden name=\"fee_type\"	value=$strFeeType>
            <input type=hidden name=\"return_url\"	value=$strRetUrl>
            <input type=hidden name=\"attach\"	value=$strAttach>
            <input type=hidden name=\"sign\"	value=$strSign>
            <input type='image' name='PayBtnUrl' src='images/pay/tenpay.gif'>
            </form>
				";
		$result=trim($result);
		return   $result;
	}
    /**
     * 提交返回处理*
     */
    function pay_receive()
    {
        /*取返回参数*/
        $strCmdno			= trim($_REQUEST['cmdno']);
        $strPayResult		= trim($_REQUEST['pay_result']);
        $strPayInfo		    = trim($_REQUEST['pay_info']);
        $strBillDate		= trim($_REQUEST['date']);
        $strBargainorId	    = trim($_REQUEST['bargainor_id']);
        $strTransactionId	= trim($_REQUEST['transaction_id']);
        $strSpBillno		= trim($_REQUEST['sp_billno']);
        $strTotalFee		= trim($_REQUEST['total_fee']);
        $strFeeType		    = trim($_REQUEST['fee_type']);
        $strAttach			= trim($_REQUEST['attach']);
        $strMd5Sign		    = trim($_REQUEST['sign']);
        
        /*本地参数*/
        /*这里替换为您的实际商户号*/
        $strSpid    = $this->cfg[v_mid];
        /*商户密钥,测试时即为商户号,正式上线后需修改*/
        $strSpkey   = $this->cfg[v_key];
        /*返回值定义*/
        $iRetOK       = 0;		// 成功
        $iInvalidSpid = 1;		// 商户号错误
        $iInvalidSign = 2;		// 签名错误
        $iTenpayErr	  = 3;		// 财付通返回支付失败

        /*验签*/
        $strResponseText  = "cmdno=" . $strCmdno . "&pay_result=" . $strPayResult .
        "&date=" . $strBillDate . "&transaction_id=" . $strTransactionId .
        "&sp_billno=" . $strSpBillno . "&total_fee=" . $strTotalFee .
        "&fee_type=" . $strFeeType . "&attach=" . $strAttach .
        "&key=" . $strSpkey;
        $strLocalSign = strtoupper(md5($strResponseText));

        if( $strLocalSign  != $strMd5Sign){
            //验证MD5签名失败
            return false;
        }

        if( $strSpid != $strBargainorId ){
            //"错误的商户号
            return false;
        }
        if( $strPayResult == "0" ){
            //成功
            //比较返回的订单号和金额与数据库中的金额是否相符
            $list = order_info($strAttach);
            if ($list[order_amount]==($strTotalFee/100)){
                /* 改变订单状态*/
                change_order($strAttach);
                return true;
            }else {
                //和定单数据库不一致
                return false;
            }
        }else {
            //支付失败
            return false;
        }
    }
}